import { Byte } from '../../api/io/Byte';
import { HashMap } from '../../api/struct/HashMap';


export const enum E_CDActivity {
	/**活动ID*/
	id,
	/**活动分组，客户端活动界面显示用*/
	activityGroup,
	/**是否永久开放--1永久开放，不进行开放类型校验，一直开放--0.进行类型、时间校验*/
	eternal,
	/**是否需要激活--0不需激活--1需要激活*/
	needActivate,
	/**开放时间类型--1.开服时间（开启天数，持续时间）--2.服务器活动时间（时间戳）--3.角色创建时间（开启天数，持续时间）--4.指定条件开启（last_min）--5.特殊时间开启（周1-周天）*/
	timeType,
	/**开启时间--type=1，[开启天数，即开服x天0:00开启]--type=2，[开始时间：年|月|日|时|分|秒]--type=3，[开始天数，即创角x天]--type=4，[无需配置，触发时记录开启时间]--type=5，[长度7，分别为周1-周天，1表示开启0表示不开]*/
	startDay,
	/**持续时间--type=1，[持续分钟数]--type=2，[结束时间：年|月|日|时|分|秒]--type=3，[持续分钟数]--type=4，[持续分钟数]--type=5，[持续分钟数]*/
	lastTime,
	/**循环周期，每隔多少天开启一次--type=1有效--注：持续时间不能大于循环天数*/
	roundDay,
	/**除去类型对应的天数--type=2有效--针对开服x天服务器，该活动不开启*/
	exceptDay,
	/**type=4，记录id（用于保存）--该值不可重复*/
	activityIndex,
	/**奖励翻倍参数*/
	doubleParam,

	/**枚举数量*/
	EnumCount
}



export class CDActivity{
	/**活动ID*/
	public id: number;
	/**活动分组，客户端活动界面显示用*/
	public activityGroup: number;
	/**是否永久开放--1永久开放，不进行开放类型校验，一直开放--0.进行类型、时间校验*/
	public eternal: number;
	/**是否需要激活--0不需激活--1需要激活*/
	public needActivate: number;
	/**开放时间类型--1.开服时间（开启天数，持续时间）--2.服务器活动时间（时间戳）--3.角色创建时间（开启天数，持续时间）--4.指定条件开启（last_min）--5.特殊时间开启（周1-周天）*/
	public timeType: number;
	/**开启时间--type=1，[开启天数，即开服x天0:00开启]--type=2，[开始时间：年|月|日|时|分|秒]--type=3，[开始天数，即创角x天]--type=4，[无需配置，触发时记录开启时间]--type=5，[长度7，分别为周1-周天，1表示开启0表示不开]*/
	public startDay: number[];
	/**持续时间--type=1，[持续分钟数]--type=2，[结束时间：年|月|日|时|分|秒]--type=3，[持续分钟数]--type=4，[持续分钟数]--type=5，[持续分钟数]*/
	public lastTime: number[];
	/**循环周期，每隔多少天开启一次--type=1有效--注：持续时间不能大于循环天数*/
	public roundDay: number;
	/**除去类型对应的天数--type=2有效--针对开服x天服务器，该活动不开启*/
	public exceptDay: number;
	/**type=4，记录id（用于保存）--该值不可重复*/
	public activityIndex: number;
	/**奖励翻倍参数*/
	public doubleParam: number;


	/**获取属性值*/
	public getAttr(idx: number): any {
		switch(idx) { 
			default: return;
			case E_CDActivity.id: return this.id;
			case E_CDActivity.activityGroup: return this.activityGroup;
			case E_CDActivity.eternal: return this.eternal;
			case E_CDActivity.needActivate: return this.needActivate;
			case E_CDActivity.timeType: return this.timeType;
			case E_CDActivity.startDay: return this.startDay;
			case E_CDActivity.lastTime: return this.lastTime;
			case E_CDActivity.roundDay: return this.roundDay;
			case E_CDActivity.exceptDay: return this.exceptDay;
			case E_CDActivity.activityIndex: return this.activityIndex;
			case E_CDActivity.doubleParam: return this.doubleParam;
		}
	}



	/**设置属性值*/
	public setAttr(idx: number, v: any): void {
		switch(idx) { 
			default: break;
			case E_CDActivity.id: this.id = v; break;
			case E_CDActivity.activityGroup: this.activityGroup = v; break;
			case E_CDActivity.eternal: this.eternal = v; break;
			case E_CDActivity.needActivate: this.needActivate = v; break;
			case E_CDActivity.timeType: this.timeType = v; break;
			case E_CDActivity.startDay: this.startDay = v; break;
			case E_CDActivity.lastTime: this.lastTime = v; break;
			case E_CDActivity.roundDay: this.roundDay = v; break;
			case E_CDActivity.exceptDay: this.exceptDay = v; break;
			case E_CDActivity.activityIndex: this.activityIndex = v; break;
			case E_CDActivity.doubleParam: this.doubleParam = v; break;
		}
	}


	/**数据*/
	public static datas: HashMap<number, CDActivity> = new HashMap<number, CDActivity>();



	/**加载数据*/
	public static load(byte: Byte): void{
		const size = byte.readInt32();
		const list : CDActivity[] = [];
		let i :number;

		for (i = 0; i < size; i++) {
			list[i] = new CDActivity();
		}
		for (i = 0; i < size; i++) {
			list[i].id = byte.readInt32();
			this.datas.put(list[i].id, list[i]);
		}
		for (i = 0; i < size; i++) {
			list[i].activityGroup = byte.readInt32();
		}
		for (i = 0; i < size; i++) {
			list[i].eternal = byte.readInt32();
		}
		for (i = 0; i < size; i++) {
			list[i].needActivate = byte.readInt32();
		}
		for (i = 0; i < size; i++) {
			list[i].timeType = byte.readInt32();
		}
		for (i = 0; i < size; i++) {
			list[i].startDay = [];
			const attrArray = list[i].startDay;
			const arraySize = byte.readInt32();
			for (let j = 0; j < arraySize; j++) {
				attrArray[j] = byte.readInt32();
			}
		}
		for (i = 0; i < size; i++) {
			list[i].lastTime = [];
			const attrArray = list[i].lastTime;
			const arraySize = byte.readInt32();
			for (let j = 0; j < arraySize; j++) {
				attrArray[j] = byte.readInt32();
			}
		}
		for (i = 0; i < size; i++) {
			list[i].roundDay = byte.readInt32();
		}
		for (i = 0; i < size; i++) {
			list[i].exceptDay = byte.readInt32();
		}
		for (i = 0; i < size; i++) {
			list[i].activityIndex = byte.readInt32();
		}
		for (i = 0; i < size; i++) {
			list[i].doubleParam = byte.readInt32();
		}
	}


	/** 获取数据*/
	public static getData(id: number): CDActivity{
		return this.datas ? this.datas.get(id) : null;
	}
}
